﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;

namespace AffichageGrille
{
    class Personnage
    {
        /// <summary>
        /// Position du personnage sur la grille
        /// </summary>
        public Point PositionPerso { get; set; }

        /// <summary>
        /// Position du personnage à l'écran
        /// </summary>
        public Vector2 PositionPixel { get; set; }

        /// <summary>
        /// Information pour savoir si le peronnage est en cours de déplacement
        /// </summary>
        public bool DeplacementEnCours { get; set; }

        /// <summary>
        /// Direction dan slaquelle va le personnage
        /// </summary>
        public Direction Direction { get; set; }

        /// <summary>
        /// Compteur pour savoir à quel numéro en est le déplacement du personnage
        /// </summary>
        private int _compteurdeplacement = 0;

        /// <summary>
        /// Liste des sprites du personnage, utilisé pour l'animation pendant le déplacement
        /// </summary>
        private Texture2D[] texturePerso = new Texture2D[4];

        /// <summary>
        /// Temps de durée de l'animation ??
        /// </summary>
        private double tempsAnimation = 0;

        /// <summary>
        /// Constructeur
        /// </summary>
        /// <param name="content">ContentManager</param>
        public Personnage(ContentManager content)
        {
            PositionPerso = new Point(11, 6);
            PositionPixel = new Vector2(PositionPerso.X * 40, PositionPerso.Y * 40);

            texturePerso[0] = content.Load<Texture2D>("perso0");
            texturePerso[1] = content.Load<Texture2D>("perso1");
            texturePerso[2] = content.Load<Texture2D>("perso2");
            texturePerso[3] = content.Load<Texture2D>("perso3");

            DeplacementEnCours = false;
        }

        /// <summary>
        /// Initialise le déplacement
        /// </summary>
        /// <param name="direction">Direction dans laquelle se déplace le personnage</param>
        public void Deplace(Direction direction)
        {
            DeplacementEnCours = true;
            Direction = direction;

            switch (Direction)
            {
                case Direction.Haut:
                    PositionPerso = new Point(PositionPerso.X, PositionPerso.Y - 1);
                    break;
                case Direction.Bas:
                    PositionPerso = new Point(PositionPerso.X, PositionPerso.Y + 1);
                    break;
                case Direction.Gauche:
                    PositionPerso = new Point(PositionPerso.X - 1, PositionPerso.Y);
                    break;
                case Direction.Droite:
                    PositionPerso = new Point(PositionPerso.X + 1, PositionPerso.Y);
                    break;
                default:
                    break;
            }
        }

        /// <summary>
        /// Méthode d'update du personnage
        /// </summary>
        /// <param name="gameTime">Temps du jeu</param>
        public void Update(GameTime gameTime) 
        {
            if (DeplacementEnCours)
            {
                tempsAnimation += gameTime.ElapsedGameTime.TotalMilliseconds;

                if (tempsAnimation > 75)
                {
                    if (_compteurdeplacement <= 3)
                    {
                        switch (Direction)
                        {
                            case Direction.Haut:
                                PositionPixel = new Vector2(PositionPixel.X, PositionPixel.Y - 10);
                                break;
                            case Direction.Bas:
                                PositionPixel = new Vector2(PositionPixel.X, PositionPixel.Y + 10);
                                break;
                            case Direction.Gauche:
                                PositionPixel = new Vector2(PositionPixel.X - 10, PositionPixel.Y);
                                break;
                            case Direction.Droite:
                                PositionPixel = new Vector2(PositionPixel.X + 10, PositionPixel.Y);
                                break;
                            default:
                                break;
                        }

                        if (_compteurdeplacement < 3)
                        {
                            _compteurdeplacement++;
                        }
                        else
                        {
                            DeplacementEnCours = false;
                            _compteurdeplacement = 0;
                        }

                        tempsAnimation = 0;
                    }


                    else
                    {
                        DeplacementEnCours = false;
                        _compteurdeplacement = 0;
                    }
                }
            }
            else
            {
                _compteurdeplacement = 0;
            }

        }
        
        /// <summary>
        /// Méthode de dessin du personnage
        /// </summary>
        /// <param name="spriteBatch">SpriteBatch</param>
        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(texturePerso[_compteurdeplacement], PositionPixel, Color.White);
        }
    }
}
